# 扑克游戏

import random


class Card:
    # 一张牌
    def __init__(self, suite, face):
        self._suite = suite
        self._face = face

    @property
    def face(self):
        return self._face

    @property
    def suite(self):
        return self._suite

    def __str__(self):
        if self._face == 1:
            face_str = 'A'
        elif self._face == 11:
            face_str = 'J'
        elif self._face == 12:
            face_str = 'Q'
        elif self._face == 13:
            face_str = 'K'
        else:
            face_str = str(self._face)
        return "%s%s" % (self._suite, face_str)
    # __repr__() 是一个非常特殊的方法，它是一个“自我描述”的方法，该方法通常用于实现这样一个功能：当程序员直接打印该对象时，系统将会输出该对象的“自我描述”信息，用来告诉外界该对象具有的状态信息。

    def __repr__(self):
        return self.__str__()


class Poker:
    # 一副牌

    def __init__(self):
        self._cards = [Card(suite, face)
                       for suite in "♠♥♣♦"
                       for face in range(1, 14)]
        self._current = 0

    @property
    def cards(self):
        return self._cards

    def shuffle(self):
        # 洗牌(随机乱序)
        self._current = 0
        # 打乱列表中的元素顺序
        random.shuffle(self._cards)

    @property
    def next(self):
        # 发牌
        card = self._cards[self._current]
        self._current += 1
        return card

    @property
    def has_next(self):
        # 还有没有牌
        return self._current < len(self._cards)


class Player:
    # 玩家

    def __init__(self, name):
        self._name = name
        self._cards_on_hand = []

    @property
    def name(self):
        return self._name

    @property
    def cards_on_hand(self):
        return self._cards_on_hand

    def get(self, card):
        # 摸牌
        self._cards_on_hand.append(card)

    def arrange(self, card_key):
        # 玩家整理手上的牌
        self._cards_on_hand.sort(key=card_key)


# 排序规则-先根据花色再根据点数排序
def get_key(card):
    return (card.suite, card.face)


def main():
    p = Poker()
    p.shuffle()
    players = [Player("东邪"), Player("西毒"), Player("南帝"), Player("北丐")]
    for _ in range(13):
        for player in players:
            player.get(p.next)
    for player in players:
        print(player.name + ":", end=" ")
        player.arrange(get_key)
        print(player.cards_on_hand)


if __name__ == "__main__":
    main()